{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "73bd968b-d970-4a05-94ef-4e7abf990827",
   "metadata": {},
   "source": [
    "Chapter 18\n",
    "\n",
    "# 估算圆周率\n",
    "Book_3《数学要素》 | 鸢尾花书：从加减乘除到机器学习 (第二版)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "05ab31ae-523d-4634-99b1-21026edd39e5",
   "metadata": {},
   "source": [
    "这段代码通过一个级数展开来近似计算 $\\pi$ 的值，并可视化其收敛过程。具体来说，代码构建了以下级数项：\n",
    "\n",
    "$$\n",
    "\\text{expansion}_n = \\frac{(2n)!}{2^{4n+2} \\cdot (n!)^2 \\cdot (2n-1) \\cdot (2n+3)}\n",
    "$$\n",
    "\n",
    "并在此基础上逐项累加，形成 $\\pi$ 的估计值：\n",
    "\n",
    "$$\n",
    "\\hat{\\pi} = 24 \\left(\\frac{\\sqrt{3}}{32} - \\sum_{k=0}^n \\text{expansion}_k \\right)\n",
    "$$\n",
    "\n",
    "随着项数 $n$ 的增加，$\\hat{\\pi}$ 值逐渐逼近真实的 $\\pi$ 值。代码将累积和结果与 $\\pi$ 的精确值进行对比，通过在图上显示估计值曲线和真实 $\\pi$ 值的水平线，展示了该级数在有限项数内对 $\\pi$ 的逼近效果。这种方法体现了级数展开在逼近常数值计算中的应用，以及通过累积求和实现逐步收敛的数学特性。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "461f55c3-bb7f-481c-a726-1f490fb292cb",
   "metadata": {},
   "source": [
    "## 导入包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d5eb2a29-53c8-4899-926b-2540841fb45c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from scipy.special import factorial  # 导入阶乘函数\n",
    "import matplotlib.pyplot as plt  # 导入绘图库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "29c963cc-9267-4354-80dc-7485113dfa86",
   "metadata": {},
   "outputs": [],
   "source": [
    "n_array = np.linspace(0, 10, 11)  # 定义 n 的取值范围"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "17f1bfe6-7c1a-4624-b39c-a39992f2fd59",
   "metadata": {},
   "source": [
    "## 计算级数展开项"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "896923c4-dda9-4fb3-a5b9-d8ffef868ad7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-8.33333333e-02,  6.25000000e-03,  2.79017857e-04,  2.71267361e-05,\n",
       "        3.46790661e-06,  5.13516940e-07,  8.34465027e-08,  1.44628917e-08,\n",
       "        2.62853542e-09,  4.95458066e-10,  9.61296357e-11])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expansion = factorial(2 * n_array) / 2**(4 * n_array + 2) / (factorial(n_array))**2 / (2 * n_array - 1) / (2 * n_array + 3)\n",
    "# expansion"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "698b303d-8ce8-462b-a08e-d93419621f52",
   "metadata": {},
   "source": [
    "## 计算 π 的估计值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c9996d0a-b9e4-479b-a015-cef9c4455a8c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3.29903811, 3.14903811, 3.14234168, 3.14169064, 3.14160741,\n",
       "       3.14159508, 3.14159308, 3.14159273, 3.14159267, 3.14159266,\n",
       "       3.14159265])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "est_pi = 24 * (np.sqrt(3) / 32 - np.cumsum(expansion))  # 使用累积和计算 π 的估计值\n",
    "est_pi"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6ac573f5-5379-4378-871e-762be24a2585",
   "metadata": {},
   "source": [
    "## 绘制 π 的估计值图像"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "43f073f4-e1c6-4fcd-a594-b17cb573e1f2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(33.722222222222214, 0.5, 'Estimate of $\\\\pi$')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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HvP4GQAAmI2gaDHMUwQAAFZBULQYgiIAALAKgqLFEBQBAIBVEBQthk23AQCAVRAULYYRRQAAYBUERYvp0cP588QJ5wsAAMAsBEWLadVKio11HvP4GQAAmImgaEE8fgYAAFZAULQg1+NngiIAADATQdGCGFEEAABWQFC0IIIiAACwAoKiBbGXIgAAsAKCogW55igeOSKVlppbCwAAaL4IihbUtq106aXOY0YVAQCAWUwPiunp6UpMTFRUVJSioqKUlJSkNWvW1Nl+xYoVSk5OVkxMjLv92rVra7VbsGCBEhISFBkZqfj4eD377LMqLy9vzK74FfMUAQCA2UwPinFxcZo7d662bdumbdu2adCgQRo+fLh27Njhsf2GDRuUnJys1atXKzc3V3fccYeGDRum7du3u9v8+c9/1oQJE/TCCy9o165dWrx4sbKysjRx4sSm6laDERQBAIDZwswuYNiwYTXez5o1S+np6dq8ebN69+5dq/2CBQtqvJ89e7ZWrVqljz/+WH379pUkffbZZxowYIAeeughSVLXrl314IMP6vPPP2+cTjQCgiIAADCb6SOK56qqqlJmZqbKysqUlJTk1TXV1dUqLS1V+/bt3eduueUW5ebmuoPh3r17tXr1at1999113sfhcKikpKTGy0xsug0AAMxm+oiiJOXn5yspKUnl5eVq3bq1Vq5cqV69enl17fz581VWVqYRI0a4zz3wwAM6duyYbrnlFhmGocrKSo0dO1YTJkyo8z5z5szRiy++2OC++AsjigAAwGw2wzAMs4uoqKhQQUGBTp48qeXLl+vtt9/W+vXrLxoWMzIy9Pjjj2vVqlUaPHiw+3xOTo4eeOABvfTSS7rpppu0e/dupaam6pe//KWmTp3q8V4Oh0MOh8P9vqSkRPHx8SouLlZUVJR/OloPx49LMTHO49OnpcjIJi8BAAAEqZKSEkVHR18051giKJ5v8ODB6tGjhxYuXFhnm6ysLD322GNatmxZrUfKAwcO1M0336x58+a5z/3pT3/Sr371K506dUohIRd/4u7tP8DGYhhSu3ZScbH0739LHqZrAgAA+MTbnGOpOYouhmHUGN07X0ZGhh599FEtXbrU47zD06dP1wqDoaGhMgxDFszFHtlsPH4GAADmMn2O4qRJkzR06FDFx8ertLRUmZmZysnJUXZ2tiRp4sSJOnjwoJYs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JUk2m03Tpk1Ty5Yt3Z9VVVVpy5Yt6tOnT70KiIuL09y5c9Xz+yTz/vvva/jw4dq+fbt69+5dq/2GDRuUnJys2bNnq23btnr33Xc1bNgwbdmyRX379pUk5eTk6MEHH1T//v0VERGhV155RUOGDNGOHTt02WWX1au+YOFajF5cLJ04IV1yibn1AAAA67MZdQ0PenDHHXdIktavX6+kpCSFh4e7PwsPD1fXrl313HPP6YorrmhQUe3bt9e8efM0ZswYr9r37t1bI0eO1LRp0zx+XlVVpXbt2umNN97QqFGjvLpnSUmJoqOjVVxcrKioKK9rt7K4OOngQWnzZummm8yuBgAAmMXbnFOvEcV//vOfkqTHHntMaWlpfg9QVVVVWrZsmcrKypSUlOTVNdXV1SotLVX79u3rbHP69GmdPXv2gm0cDof7qwgl5z/AYNOzpzMo7t5NUAQAABfn0xzFd999168hMT8/X61bt5bdbteTTz6plStXqlevXl5dO3/+fJWVlWnEiBF1tpkwYYIuu+wyDR48uM42c+bMUXR0tPsVHx9f735YHXspAgCA+vBp1bPLzp07VVBQoIqKihrn77nnnnrdJyEhQXl5eTp58qSWL1+u0aNHa/369RcNixkZGZo+fbpWrVqlDh06eGzzyiuvKCMjQzk5ORdcaDNx4kT3HEzJOaIYbGHRtaCFvRQBAIA3fAqKe/fu1X333af8/HzZbDb3KmibzSZJ9d4eJzw83L2YpV+/ftq6davS0tK0cOHCOq/JysrSmDFjtGzZsjpHCl999VXNnj1bf/vb35SYmHjBGux2u+x2e73qDjRskQMAAOrDp0fPqamp6tatm44cOaKWLVtqx44d2rBhg/r166ecnJwGF2UYRo35gufLyMjQo48+qqVLl+ruu+/22GbevHmaOXOmsrOza+z12JwRFAEAQH34NKL42Wef6R//+IdiYmIUEhKikJAQ3XLLLZozZ46efvppbd++3et7TZo0SUOHDlV8fLxKS0uVmZmpnJwcZWdnS3I+Ej548KCWLFkiyRkSR40apbS0NN188806fPiwJCkyMlLR0dGSnI+bp06dqqVLl6pr167uNq1bt1br1q196XJQcM1RPHbMuU3O9/+4AAAAPPJpRLGqqsoduC699FIdOnRIktSlSxd9/fXX9brXkSNHlJKSooSEBN15553asmWLsrOzlZycLEkqKipSQUGBu/3ChQtVWVmpcePGKTY21v1KTU11t3nzzTdVUVGhn/3sZzXavPrqq750N2hERUmuqZzMUwQAABfj04jiNddco6+++krdu3fXTTfdpFdeeUXh4eFatGiRurt2dvbS4sWLL/j5e++9V+O9N4+29+/fX68ampOePaWjR52Pn6+/3uxqAACAlfk0ojhlyhRVV1dLkl566SUdOHBAAwcO1OrVq/W73/3OrwXCv5inCAAAvOXTiOJdd93lPu7evbt27typEydOqF27du6Vz7AmgiIAAPCWz/solpeX66uvvtLRo0fdo4su9d1HEU2HTbcBAIC3fAqK2dnZSklJ0XfffVfrM5vNVu99FNF02HQbAAB4y6c5ik899ZRGjBihoqIiVVdX13gREq3NFRQPHZLKysytBQAAWJtPQfHo0aMaP368Onbs6O960Mjat5fatXMe791rbi0AAMDafAqKP/vZz/zyDSwwBwtaAACAN3yao/jGG2/o5z//uTZu3Khrr71WLVq0qPH5008/7Zfi0Dh69pS2biUoAgCAC/MpKC5dulRr165VZGSkcnJyamyJY7PZCIoWx4giAADwhk9BccqUKZoxY4YmTJigkBCfnl7DRARFAADgDZ9SXkVFhUaOHElIDFAERQAA4A2fkt7o0aOVlZXl71rQRFybbhcWSg6HubUAAADr8unRc1VVlV555RWtXbtWiYmJtRazvPbaa34pDo2jQwepdWvp1Clp3z7pqqvMrggAAFiRT0ExPz9fffv2lST9+9//rvEZ3/VsfTab8/FzXp7z8TNBEQAAeOJTUPznP//p7zrQxM4NigAAAJ6wGqWZYkELAAC4GK9HFMePH6+ZM2eqVatWGj9+/AXbMkfR+giKAADgYrwOitu3b9fZs2fdx3VhjmJgICgCAICL8Toonjsv8f3331dcXFytfRQNw1BhYaH/qkOjcQXF/fuls2el8xauAwAA+DZHsVu3bjp+/Hit8ydOnFC3bt0aXBQaX2ysFBkpVVVJBw6YXQ0AALAin4KiYRgez586dUoRERENKghNIyRE6t7debxnj7m1AAAAa6rX9jiuRSw2m03Tpk1Ty5Yt3Z9VVVVpy5Yt6tOnj18LROPp2VPascM5T/Guu8yuBgAAWE29gqJrEYthGMrPz1d4eLj7s/DwcF133XV67rnn/Fsh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ubrmrU2bNrXmirZq1UqXXHIJc0gt4Nlnn1X//v01e/ZsjRgxQp9//rkWLVqkRYsWmV0aJA0bNkyzZs3S5Zdfrt69e2v79u167bXX9Itf/MLs0pqdU6dOaffu3e73+/btU15entq3b6/LL79czzzzjGbPnq0rrrhCV1xxhWbPnq2WLVvqoYceavpiDZjq97//vdGlSxcjPDzcuP76643169ebXVKzJ8nj69133zW7NHhw2223GampqWaXge99/PHHxjXXXGPY7XbjqquuMhYtWmR2SfheSUmJkZqaalx++eVGRESE0b17d2Py5MmGw+Ewu7Rm55///KfHf8+MHj3aMAzDqK6uNl544QWjU6dOht1uN2699VYjPz/flFrZRxEAAAAeMUcRAAAAHhEUAQAA4BFBEQAAAB4RFAEAAOARQREAAAAeERQBAADgEUERAAAAHhEUAQAA4BFBEQAAAB4RFAEAAOARQREAAAAehZldAAA0Z7fffrsSExMVERGht99+W+Hh4XryySc1ffp0s0sDAEYUAcBs77//vlq1aqUtW7bolVde0YwZM7Ru3TqzywIA2QzDMMwuAgCaq9tvv11VVVXauHGj+9yNN96oQYMGae7cuSZWBgCMKAKA6RITE2u8j42N1dGjR02qBgB+QFAEAJO1aNGixnubzabq6mqTqgGAHxAUAQAA4BFBEQAAAB4RFAEAAOARq54BAADgESOKAAAA8IigCAAAAI8IigAAAPCIoAgAAACPCIoAAADwiKAIAAAAjwiKAAAA8IigCAAAAI8IigAAAPCIoAgAAACPCIoAAADw6P8HbwW5J0Tan8gAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.axhline(y=np.pi, color='r', linestyle='-')  # 绘制真实 π 值的水平线\n",
    "plt.plot(n_array, est_pi, color='b', marker='x')  # 绘制 π 的估计值曲线\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.xlabel('n')  # 设置 x 轴标签\n",
    "plt.ylabel(r'Estimate of $\\pi$')  # 设置 y 轴标签"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "85a80909-2aac-49ed-bb7a-f8cc6b80ee7d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ecd322f4-f919-4be2-adc3-69d28ef25e69",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
